home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nebula 1
/
Nebula One.iso
/
Utilities
/
Unix
/
skey
/
src
/
skey.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-11-08
|
3KB
|
153 lines
/*
* S/KEY v1.1b (skey.c)
*
* Authors:
* Neil M. Haller <nmh@thumper.bellcore.com>
* Philip R. Karn <karn@chicago.qualcomm.com>
* John S. Walden <jsw@thumper.bellcore.com>
* Scott Chasin <chasin@crimelab.com>
*
*
* Stand-alone program for computing responses to S/Key challenges.
* Takes the iteration count and seed as command line args, prompts
* for the user's key, and produces both word and hex format responses.
*
* Usage example:
* >skey 88 ka9q2
* Enter password:
* OMEN US HORN OMIT BACK AHOY
* >
*/
#include <stdio.h>
#ifdef HAS_STD_LIB
#include <stdlib.h>
#else
#include <sys/types.h>
#endif
#include <string.h>
#ifdef __MSDOS__
#include <dos.h>
#else /* Assume BSD unix */
#include <fcntl.h>
#include <sgtty.h>
#endif
#include "md4.h"
#include "skey.h"
char *readpass ();
void usage ();
int getopt ();
extern int optind;
extern char *optarg;
main (argc, argv)
int argc;
char *argv[];
{
int n, cnt, i, pass = 0;
char passwd[256], key[8], buf[33], *seed, *slash;
cnt = 1;
while ((i = getopt (argc, argv, "n:p:")) != EOF)
{
switch (i)
{
case 'n':
cnt = atoi (optarg);
break;
case 'p':
strcpy (passwd, optarg);
pass = 1;
break;
}
}
/* could be in the form <number>/<seed> */
if (argc <= optind + 1)
{
/* look for / in it */
if (argc <= optind)
{
usage (argv[0]);
exit (1);
}
slash = strchr (argv[optind], '/');
if (slash == NULL)
{
usage (argv[0]);
exit (1);
}
*slash++ = '\0';
seed = slash;
if ((n = atoi (argv[optind])) < 0)
{
printf ("%s not positive\n", argv[optind]);
usage (argv[0]);
exit (1);
}
}
else
{
if ((n = atoi (argv[optind])) < 0)
{
printf ("%s not positive\n", argv[optind]);
usage (argv[0]);
exit (1);
}
seed = argv[++optind];
}
/* Get user's secret password */
if (!pass)
{
printf ("Enter secret password: ");
readpass (passwd, sizeof (passwd));
}
rip (passwd);
/* Crunch seed and password into starting key */
if (keycrunch (key, seed, passwd) != 0)
{
fprintf (stderr, "%s: key crunch failed\n", argv[0]);
exit (1);
}
if (cnt == 1)
{
while (n-- != 0)
f (key);
printf ("%s\n", btoe (buf, key));
#ifdef HEXIN
printf ("%s\n", put8 (buf, key));
#endif
}
else
{
for (i = 0; i <= n - cnt; i++)
f (key);
for (; i <= n; i++)
{
#ifdef HEXIN
printf ("%d: %-29s %s\n", i, btoe (buf, key), put8 (buf, key));
#else
printf ("%d: %-29s\n", i, btoe (buf, key));
#endif
f (key);
}
}
exit (0);
}
void
usage (s)
char *s;
{
printf ("Usage: %s [-n count] [-p password ] <sequence #>[/] <key> \n", s);
}